週刊 Automatineマガジン2. Changerを使う
概要
ゲーム作ってて、操作する対象がいて、アイテムとか敵キャラがあって、
じゃあ敵キャラに攻撃だ! おやっこの敵キャラ複数のプレイヤーから殴られてるぞ?!とかあって、
フラグを持って状態判断するのは簡単、、なんだが、
「フラグの数がアババババばばば」
「えっこれとこれどっち優先すんの?」
「排他ァァぁ!?? もしかして排他ですかァァァァ!!??」
とかがある。
Automatineはこの辺に対して、Changerというものをもって挑む。
基本概念
殴られて死んだなら「お前もう死んでるから、次の状態はこれな」っていう
次の状態のラベルをもらえば良くない?
というのが基本の概念。
フラグを立てるのではなく、
・君、次は死んだ状態に行くといいよ
みたいなのをもらう。
この発想のいいところ
フラグの上げ下げが必要ない。次の状態の候補をもらうだけ。
この発想の悪いところ
その変化の候補ってどこからもらうの?とかその辺
Autoに対して、Changer = 可能性の定義 を行う
Automatineでは、Autoという単位が「現在の状態すべて」を持つようになっている。」
また、各Timeline、TackにはConditionを振ることができる。
で、
このAutoに、
「こういう状態だったら次はこの状態(別のAuto)に変わる可能性があるよね」
ていうのを列挙していくことができる。
1.「Conditionの、Damage.無敵 が ないフレームであれば、ダメージを受けた状態になる可能性がある」
2.「Conditionの、Damage.無敵 が ないフレームであれば、ダメージを受けて死んだ状態になる可能性がある」
1がダメージ受け中状態に移り変わる可能性のある条件、
2がダメージを受けて死ぬ可能性のある条件。
Autoに定義できる状態のみで判断して、こんな風に書き出せるわけだ。
1をChangerToDamaged、
2をChangerToDead、みたいに、名前と「次どんな状態になるか」をつけて、このAutoに保存することができる。
で、これをChanger(変化させるもの)と呼ぶ。
Autoにこれらを定義できることで、「別のAutoから見て、どんな変化の候補があるか」というのが作り出せた。
実際に使うとしたらこんな感じ。
実用Changer
次みたいなシチュエーションで使える。
1.PlayerがMonsterを殴った!
2.PlayerはMonsterのAutoからChangerを取得、ダメージ与えてHPが0になるのを確認したので、ChangerToDead をMonsterのAutoに積む。
複数の可能性があるならそれら全部を返してもいい。
3.Monsterは自分の行動のタイミングで、自分のAutoに積まれたChangerから、自分が受け入れなければいけないものを見る。
「わーい俺の番だぞ~積まれてるのは、、あっ死んだぞっていうのが積まれてる、、俺死んだのか、、」
4.ここで、Monsterは「死んでる状態」に移行する。
ざっとこんな感じ。
この方法のいいところは、hpフラグの確認をしているのがPlayer=殴った側で、殴られた側に可能性を積むだけで、予約が済んでいること。
受けた側がHPを確認する必要すら無いかもしれない。
(ネットゲーとかで殺したどうのとかする場合、この判定をサーバ側でも行えばいい。間違ってもクライアント側だけでやっちゃダメ。)
(実装を分割して、判定はサーバからのみ、とかにすれば良い。)